//axios 二次封装
import axios from "axios";
import errorCode from "@/utils/errorCode";
import {Notification, Message, MessageBox} from "element-ui";
import {getToken} from "@/utils/auth";
//引入进度条
import nprogress from 'nprogress';

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
//创建axios实例
const requests = axios.create({
    // axios中请求配置有baseURL选项，表示请求URL公共部分
    baseURL: process.env.VUE_APP_BASE_API,
    // 超时
    timeout: 10000
})

//request拦截器
requests.interceptors.request.use((config)=>{
    // 是否需要设置 token
    const isToken =(config.headers || {}).isToken === false;
    //设置请求头
    if (getToken() && !isToken) {
        config.headers['token'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
        // console.log(config.headers['token'])
    }

    return config;
},error => {
    Promise.reject(error).then(() => {});
})


//响应拦截器
requests.interceptors.response.use(res=>{
    console.log(res);
    // 未设置状态码则默认成功状态
    const code = res.data.code || 200;
    // 获取错误信息
    const msg = errorCode[code] || res.data.content || errorCode['default'];

    //统一的异常处理
    if(code === 401){
        //用户未登录,或token已过期
        MessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
                confirmButtonText: '重新登录',
                cancelButtonText: '取消',
                type: 'warning'
            }
        ).then(() => {
            store.dispatch('Logout').then(() => {
                location.href = '/login'
            })
        }).catch(() => {
            // nprogress.done();
        });
        return Promise.reject('无效的会话，或者会话已过期，请重新登录。')
    }
    else if(code === 500){
        Message({
            message: msg,
            type: 'error'
        })
        return Promise.reject(new Error(msg))
    }else if (code !== 200){
        Notification.error({
            title: msg
        })
        return Promise.reject('error')
    }else {
        //请求成功，则返回响应数据
        return res.data
    }
},error =>{
    console.log('err' + error);
    let message = "系统繁忙，请稍后重试";
    Message({
        message: message,
        type: 'error',
        duration: 5 * 1000
    })
    return Promise.reject(error)
})

export default requests;
